package com.core;

import java.util.List;
import java.util.Map;

import org.hibernate.criterion.DetachedCriteria;


public interface BaseDao<T> {

	/**
	 * 根据ID获取实体对象.
	 * 
	 * @param id
	 *            记录ID
	 * @return 实体对象
	 */
	public T get(Integer id);

	/**
	 * 根据ID获取实体对象.
	 * 
	 * @param id
	 *            记录ID
	 * @return 实体对象
	 */
	public T load(Integer id);
	
	/**
	 * 根据ID数组获取实体对象集合.
	 * 
	 * @param ids
	 *            ID对象数组
	 * 
	 * @return 实体对象集合
	 */
	public List<T> get(Integer[] ids);
	
	/**
	 * 根据属性名和属性值获取实体对象.
	 * 
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            属性值
	 * @return 实体对象
	 */
	public T get(String propertyName, Object value);
	
	/**
	 * 
	 * @param proterty 属性键值对 String 属性名称  object 属性值
	 * @return
	 */
	public List<T> getList(Map<String, Object> proterty);
	public List<T> getList(String hql);
	/**
	 * 模糊查询
	 * @param proterty 属性键值对 String 属性名称  object 属性值
	 * @return
	 */
	public List<T> getListLike(Map<String, Object> proterty);
	
	/**
	 * 根据属性名和属性值获取实体对象集合.
	 * 
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            属性值
	 * @return 实体对象集合
	 */
	public List<T> getList(String propertyName, Object value);

	/**
	 * 获取所有实体对象集合.
	 * 
	 * @return 实体对象集合
	 */
	public List<T> getAll();
	
	/**
	 * 获取所有实体对象总数.
	 * 
	 * @return 实体对象总数
	 */
	public Long getTotalCount();
	
	/**
	 * 更具条件查询对象的的个数
	 * @param propertyMap  String 属性名称 object 属性值
	 * @return
	 */
	public Long getTotalCountLike(Map<String, Object> propertyMap);

	/**
	 * 根据属性名、修改前后属性值判断在数据库中是否唯一(若新修改的值与原来值相等则直接返回true).
	 * 
	 * @param propertyName
	 *            属性名称
	 * @param oldValue
	 *            修改前的属性值
	 * @param oldValue
	 *            修改后的属性值
	 * @return boolean
	 */
	public boolean isUnique(String propertyName, Object oldValue, Object newValue);
	
	/**
	 * 根据属性名判断数据是否已存在.
	 * 
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            值
	 * @return boolean
	 */
	public boolean isExist(String propertyName, Object value);

	/**
	 * 保存实体对象.
	 * 
	 * @param entity
	 *            对象
	 * @return ID
	 */
	public Integer save(T entity);
	public String add(T entity);

	/**
	 * 更新实体对象.
	 * 
	 * @param entity
	 *            对象
	 */
	public void update(T entity);
	
	/**
	 * 删除实体对象.
	 * 
	 * @param entity
	 *            对象
	 * @return
	 */
	public void delete(T entity);

	/**
	 * 根据ID删除实体对象.
	 * 
	 * @param id
	 *            记录ID
	 */
	public void delete(Integer id);

	/**
	 * 根据ID数组删除实体对象.
	 * 
	 * @param ids
	 *            ID数组
	 */
	public void delete(Integer[] ids);

	/**
	 * 刷新session.
	 * 
	 */
	public void flush();

	/**
	 * 清除Session.
	 * 
	 */
	public void clear();
	
	/**
	 * 清除某一对象.
	 * 
	 * @param object
	 *            需要清除的对象
	 */
	public void evict(Object object);
	
	
	
	/**
	 * 根据Pager对象进行   模糊查询
	 * @param pager
	 * @param property    String 属性名称，object 属性值
	 * @return
	 */
	public Pager findByPagerLike(Pager pager, Map<String,Object> property);
	public Pager findByPagerLike(Pager pager, Map<String,Object> property,Map<String,Object> map);
	/**
	 * 根据Pager对象进行   精确查询查询
	 * @param pager
	 * @param property    String 属性名称，object 属性值
	 * @return
	 */
	public Pager findByPagerEquel(Pager pager, Map<String,Object> property);
	/**
	 * 根据Pager对象进行   精确查询查询
	 * @param pager
	 * @param property
	 * @param operation  ">" "<"
	 * @param date  时间
	 * @return
	 */
	
	public Pager findByPagerEquel(Pager pager, Map<String,Object> property,String operation,String date);
	public Pager findByPagerEquel(Pager pager, Map<String,Object> property,String operation1,String date1,String operation2,String date2);
	
	/**
	 * 根据Pager对象进行查询(提供分页、查找、排序功能).
	 * 
	 * @param pager
	 *            Pager对象
	 * @return Pager对象
	 */
	public Pager findByPager(Pager pager);
	
	/**
	 * 根据Pager和DetachedCriteria对象进行查询(提供分页、查找、排序功能).
	 * 
	 * @param pager
	 *            Pager对象
	 * @return Pager对象
	 */
	public Pager findByPager(Pager pager, DetachedCriteria detachedCriteria);

}
